package com.shihb.chapter03oop

object Demo09Trait {
  def main(args: Array[String]): Unit = {

    val sheep = new Sheep
    sheep.sayHi
    sheep.sayHello

  }

}
//在scala中，java的接口都可以当做特质来使用
// 如果一个类有父类要先写父类再with 特质1 with 特质2
//trait Serializable extends Any with java.io.Serializable

/**
 * 当一个trait有抽象方法和非抽象方法时
 * 1、一个trait底层对应两个.class
 *  trait01.class  接口
 *  Trait01$class.class 抽象类
 */
trait Trait01{
  var traitVar1=10
  var traitVar2:String
  // 抽象方法
  def sayHi
  // 实现普通方法
  def sayHello: Unit ={
    println("say Hello")
  }
}

/**
 * 底层实现Traint01 :class Sheep implements Trait01
 * 当Sheep要使用sayHello,直接调用rait01$class的方法
 * public void sayHello(){
 *    Trait01$class.sayHello(this);
 * }
 */
class Sheep extends Trait01{
  override def sayHi: Unit = {
    println("小羊sayHi")
  }
  // 特质的属性会直接变成Sheep的属性,不管是不是抽象
  override var traitVar2: String = _
}
/*底层源码
import scala.Predef$;
public abstract class Trait01$class{
    public static void sayHello(Trait01 $this){
        Predef$.MODULE$.println("say Hello");
    }
    public static void $init$(Trait01 trait01){}
}

public interface Trait01{
    public abstract void sayHi();
    public abstract void sayHello();
}

import scala.Predef$;
public class Sheep implements Trait01{
    private String traitVar2;
    private int traitVar1;
    public void sayHello(){
       Trait01$class.sayHello(this);
    }
    public void sayHi(){
        P .MODULE$.println("\u5C0F\u7F8AsayHi");
    }
    public Sheep(){
        Trait01$class.$init$(this);
    }
}


 */
